package br.com.gip.business.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.gip.business.RelacionamentoBusiness;
import br.com.gip.repository.dao.RelacionamentoDao;
import br.com.gip.repository.model.Artefato;
import br.com.gip.repository.model.Categoria;
import br.com.gip.repository.model.Relacionamento;
import br.com.gip.wrapper.RelacionamentoArtefato;

@Service
public class RelacionamentoBusinessImpl implements RelacionamentoBusiness {

	private static final long serialVersionUID = -2154824749382710719L;
	
	@Autowired
	private RelacionamentoDao relacionamentoDao;
	
	@Override
	public List<Relacionamento> buscarRelacionamentos(Categoria categoria) {
		return null;
	}

	@Override
	public List<Relacionamento> buscarRelacionamentos(Artefato artefato) {
		return this.relacionamentoDao.findRelacionamentos(artefato);
	}
	
	@Override
	public List<Artefato> buscarDependencias(Artefato artefato) {
		return this.relacionamentoDao.findDependentes(artefato);
	}

	@Override
	public void salvarRelacionamentos(List<Relacionamento> relacionamentos) {
		this.relacionamentoDao.saveOrUpdateAll(relacionamentos);
	}

	@Override
	public List<RelacionamentoArtefato> buscarRelacionamentos(String nomeArtefato, Long categoriaId, Long projetoId) {
		List<RelacionamentoArtefato> relacionamentos = new ArrayList<RelacionamentoArtefato>();

		Map<Artefato, RelacionamentoArtefato> map = new HashMap<Artefato, RelacionamentoArtefato>();
		for (Relacionamento relacionamento : this.relacionamentoDao.findRelacionamentos(nomeArtefato, categoriaId, projetoId)) {
			if (map.containsKey(relacionamento.getOrigem())) {
				map.get(relacionamento.getOrigem()).getDestinos().add(relacionamento.getDestino());
				map.get(relacionamento.getOrigem()).getRelacionamentos().add(relacionamento);
			} else {
				map.put(relacionamento.getOrigem(), new RelacionamentoArtefato(relacionamento.getOrigem(), new ArrayList<Artefato>(Arrays.asList(relacionamento.getDestino())), new ArrayList<Relacionamento>(Arrays.asList(relacionamento))));
			}
		}
		
		for (Entry<Artefato, RelacionamentoArtefato> entry : map.entrySet()) {
			relacionamentos.add(entry.getValue());
		}
		
		return relacionamentos;
	}

	@Override
	public void removerRelacionamentos(List<Relacionamento> relacionamentos) {
		for (Relacionamento relacionamento : relacionamentos) {
			this.relacionamentoDao.delete(relacionamento);	
		}
	}

	@Override
	public void removerRelacionamentos(Artefato artefato) {
		for (Relacionamento relacionamento : this.buscarRelacionamentos(artefato)) {
			this.relacionamentoDao.delete(relacionamento);
		}
	}
	
}
 